/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package patterns;

import java.util.LinkedList;
import java.util.List;
import org.apache.log4j.Logger;

/**
 *
 * @author Версанов Кирилл
 */
public class Pattern implements IPattern {
    private static final Logger log = Logger.getLogger(IPattern.class);
    /**Конструктор класса создания шаблонов регулярных выражений 
     * для парсинга сайтов:
     * (http://hotline.ua/;
     * http://www.nvidia.ru/;
     * http://dx.com/;)
     * @param name имя шаблона(hotLineUa,invidiaRU,DX)
     */
    public Pattern(String name) {
         if (!name.equals(hotLineUA) && !name.equals(invidiaRU) && !name.equals(DX)){
            log.error("Ошибка!Для парсинга введите одно из следующих имен:"
                    + "hotLineUA, invidiaRU, DX");
         }
        this.name = name;
    }


    /**Метод инициализирует шаблоны регулярных выражений
     *
     * @return коллекцию скомпилированных шаблонов 
     */
    @Override
    public List<java.util.regex.Pattern> getPatterns() {
        if (patterns == null) {
            patterns = new LinkedList<java.util.regex.Pattern>();
            init(name);
        }
        return patterns;
    }

    private void init(String name) {
       
        switch (name) {
            case "hotLineUA":
                hotlinePatterns();
                break;
            case "invidiaRU":
                invidiaPatterns();
                break;
            case "DX":
                dxPatterns();
                break;
        }
    }

    private void hotlinePatterns() {
        patterns.add(java.util.regex.Pattern.compile("(Производитель)\\s+(\\w*)"));
        patterns.add(java.util.regex.Pattern.compile("(Тип)\\s+(?!крепления)([А-я]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Струны,\\s*количество)\\s+(\\d+)"));
        patterns.add(java.util.regex.Pattern.compile("(Лады,\\s*количество)\\s+(\\d+)"));
        patterns.add(java.util.regex.Pattern.compile("(Корпус)\\s+([а-я]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Гриф)\\s+([а-я]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Накладка грифа)\\s+([а-я]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Тип крепления грифа)\\s+([а-я]+\\s*[а-я]+"
                + "\\s*[а-я]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Мензура\\s+размер,\\s*мм)\\s+(\\d+)"));
        patterns.add(java.util.regex.Pattern.compile("(Ширина\\s+накладки\\s+грифа\\s*"
                + "\\(у верхнего порожка\\),\\s+мм)\\s+(\\d+)"));
        patterns.add(java.util.regex.Pattern.compile("(Бридж\\s+\\(струнодержатель\\))\\s+(\\w+"
                + "\\s+\\w+\\s+\\w+\\s+\\w+)"));
        patterns.add(java.util.regex.Pattern.compile("(Система тремоло)\\s+([а-я]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Колки\\/механика)\\s+([а-я]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Звукосниматели)\\s+(\\w+\\-\\w+\\-\\w+)"));
        patterns.add(java.util.regex.Pattern.compile("(Активная электроника)\\s+([а-я]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Регуляторы)\\s+([а-я]+\\-[\\d,]+\\s+"
                + "[а-я]+\\-\\d+)"));
        patterns.add(java.util.regex.Pattern.compile("(Цвет\\/отделка)\\s+([а-я,]+\\s+[а-я,]+"
                + "\\s+[а-я]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Комплектация)\\s+([а-я]+\\s+"
                + "[\\w®\\s,(.\\d\\-)]+)"));
    }

    private void invidiaPatterns() {
        patterns.add(java.util.regex.Pattern.compile("(Ядер CUDA)\\s+(\\d+)"));
        patterns.add(java.util.regex.Pattern.compile("(Базовая тактовая частота)\\s+"
                + "(\\d+\\s+[\\w]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Тактовая частота с ускорением)\\s+"
                + "([\\d\\s\\w]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Скорость заполнения текстур)\\s+"
                + "([\\d.]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Объем памяти)\\s+([\\d\\s\\w]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Интерфейс памяти)\\s+([\\d\\-\\w\\s]+.*)"));
        patterns.add(java.util.regex.Pattern.compile("(Максимальная полоса пропускания памяти)\\s+"
                + "([\\d\\.]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Программное окружение)\\s+([\\w]+)"));
        patterns.add(java.util.regex.Pattern.compile("(DirectX)\\s+([\\d]*)"));

        patterns.add(java.util.regex.Pattern.compile("(OpenGL)\\s+([\\d.]+)"));
        patterns.add(java.util.regex.Pattern.compile("(PCI-E)\\s+([\\d.]+)"));

        patterns.add(java.util.regex.Pattern.compile("(Максимальное цифровое разрешение)\\s+"
                + "([\\d\\w]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Максимальное VGA разрешение)\\s+"
                + "([\\d\\w]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Медиа соединение)\\s+([\\w\\s\\-]*)"));
        patterns.add(java.util.regex.Pattern.compile("(Аудио вход для HDMI)\\s+(\\w+)"));
        patterns.add(java.util.regex.Pattern.compile("(Высота)\\s+([\\d\\.\\s\\w\\/]+.*)"));
        patterns.add(java.util.regex.Pattern.compile("(Длина)\\s+([\\d\\.\\s\\w\\/]+.*)"));
        patterns.add(java.util.regex.Pattern.compile("(Ширина)\\s+([а-тД\\s]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Максимальная температура)\\s+(\\d+)"));
        patterns.add(java.util.regex.Pattern.compile("(Потребление энергии)\\s+([\\d\\w\\s]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Минимальные системные требования по питанию)\\s+"
                + "([\\d\\w\\s]+)"));
        patterns.add(java.util.regex.Pattern.compile("(Разъемы питания)\\s+"
                + "([\\d\\-\\w\\s]*\\s+.*)"));
    }

    private void dxPatterns() {
        patterns.add(java.util.regex.Pattern.compile("(Color:)\\s+([\\w\\s\\+]+)(!?Model)"));
        patterns.add(java.util.regex.Pattern.compile("(Model:)\\s+([\\w\\d\\+]*)"));
        patterns.add(java.util.regex.Pattern.compile("(Operating System:)\\s+([\\w\\s\\d\\.]*)"
                + "(!?Processor)"));
        patterns.add(java.util.regex.Pattern.compile("(Processor:)\\s+([\\w\\s\\d\\-]*)(!?Memory)"));
        patterns.add(java.util.regex.Pattern.compile("(Memory:)\\s+([\\d\\s\\w]*)(!?Capacity)"));
        patterns.add(java.util.regex.Pattern.compile("(Capacity:)\\s+([\\w\\-\\d\\s\\/\\(\\)]+)"
                + "(!?Display)"));
        patterns.add(java.util.regex.Pattern.compile("(Display:)\\s+(\\d+.\\s+[\\d\\:\\s\\w\\(]+\\))"));
        patterns.add(java.util.regex.Pattern.compile("(Video Formats:)\\s+"
                + "([\\d\\w\\s\\/\\.\\(]+\\)+\\s+[\\/\\s]+\\w+\\s+\\/+\\s+[\\w\\s]+\\/\\w+\\/+\\w+)"));
        patterns.add(java.util.regex.Pattern.compile("(Audio Formats:)\\s+([\\w\\/\\+]+)"));

        patterns.add(java.util.regex.Pattern.compile("(Picture Formats:)\\s+([\\w\\/\\+]+)"));
        patterns.add(java.util.regex.Pattern.compile("(E-Book Formats:)\\s+([\\w\\/\\+]+)"));

        patterns.add(java.util.regex.Pattern.compile("(Network:)\\s+([\\w\\/\\-\\s\\.\\;]+)"
                + "(!?Camera)"));
        patterns.add(java.util.regex.Pattern.compile("(Camera:)\\s+([\\w+\\-\\s]+)"
                + "(!?Microphone)"));
        patterns.add(java.util.regex.Pattern.compile("(Speaker:)\\s+([\\w+\\-\\s]+)"
                + "(!?Slots)"));
        patterns.add(java.util.regex.Pattern.compile("(Function:)\\s+([\\w\\-\\s]+)(!?Software)"));
        patterns.add(java.util.regex.Pattern.compile("(Software:)\\s+([\\w\\s]+\\.+)"));
        patterns.add(java.util.regex.Pattern.compile("(Languages:)\\s+([\\w\\s\\/]+)(!?Battery)"));
        patterns.add(java.util.regex.Pattern.compile("(Battery:)\\s+([\\w\\-\\s\\/]+)(!?Accessories)"));

    }
    private List<java.util.regex.Pattern> patterns;
    private String name;
    private String hotLineUA = "hotLineUA";
    private String invidiaRU = "invidiaRU";
    private String DX = "DX";
}
